package model

import (
	"gorm.io/gorm" // 导入GORM库，用于数据库对象关系映射
	"time"         // 导入时间包，用于处理时间类型字段
)

// User 定义用户模型，对应数据库中的用户表
// 结构体字段通过GORM标签配置数据库属性，通过JSON标签控制控制JSON序列化行为
type User struct {
	ID uint `gorm:"primaryKey" json:"id"`
	// 用户名字段
	// gorm标签说明：
	// - column:username：指定数据库列名为username
	// - type:varchar(50)：字段类型为varchar，长度50
	// - not null：该字段不允许为空
	// - unique：该字段值必须唯一（不可重复注册）
	// json标签：序列化为JSON时使用"username"作为键名
	Username string `gorm:"column:username;type:varchar(50);not null;unique" json:"username"` // 唯一用户名

	// 密码字段（存储哈希后的密码）
	// gorm标签说明：
	// - type:varchar(100)：预留足够长度存储哈希后的密码（如bcrypt加密结果）
	// json标签："-"表示序列化为JSON时忽略该字段（避免密码泄露）
	Password string `gorm:"column:password;type:varchar(100);not null" json:"-"` // 密码哈希（返回时隐藏）

	// 邮箱字段
	// gorm标签说明：
	// - unique：邮箱地址必须唯一
	// - type:varchar(100)：适配大多数邮箱地址长度
	Email string `gorm:"column:email;type:varchar(100);not null;unique" json:"email"` // 新增：唯一邮箱

	// 创建时间
	// GORM会自动在插入记录时设置该字段为当前时间
	CreatedAt time.Time `gorm:"column:created_at" json:"created_at"`

	// 更新时间
	// GORM会自动在更新记录时更新该字段为当前时间
	UpdatedAt time.Time `gorm:"column:updated_at" json:"updated_at"`

	// 软删除标记
	// gorm.DeletedAt是GORM提供的特殊类型，用于实现软删除
	// gorm标签：index表示为该字段创建索引，提升查询性能
	// json标签：忽略该字段，前端无需知道软删除状态
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` // 软删除（返回时隐藏）
}

// TableName 自定义表名映射
// GORM默认会将结构体名转为复数形式作为表名（如User->users）
// 该方法显式指定表名为"t_user"，遵循数据库表名前缀规范（t_表示table）
func (User) TableName() string {
	return "t_user"
}
